let models = require('../../models/models');
let tools = require('../../tools');
let Excel = require('exceljs');
let IDValidator = require('id-validator');
let fs = require('fs');

class student {

    list(req, res) {
        let page = req.query.page;
        page = page ? page : 1;
        let pageSize = 10;
        models.student.findAndCountAll({
            offset: (page - 1) * pageSize,
            limit: pageSize,
            order: [
                ['id', 'DESC']
            ],
            include: [
                {
                    model: models.cl,
                    attributes: ['name', 'start']
                }
            ]
        }).then(function (data) {
            console.log(models.toArray(data.rows));
            let pageNum = data.count % pageSize ? Math.ceil(data.count / pageSize) : data.count / pageSize;
            res.render('admin/student-list', { list: models.toArray(data.rows), pageNum, page });

        })
    }
    /**
     * 根据班级id查询出该班的所有学生列表
     */
    list2(req, res){
        // todo 验证id的真实性
        let id = req.query.id;
        models.student.findAll({
            where: {
                cls_id: id
            }
        }).then(data => {
            res.render('admin/student-list2', {list: models.toArray(data)})
        })

    }

    /**
     * 渲染导入学生的页面
     * @param {*} req 
     * @param {*} res 
     */
    importStudent(req, res) {
        // 读取所有的班级信息
        models.cl.findAll({
            order: [
                ['id', 'DESC']
            ]
        }).then(data => {

            res.render('admin/studentr-import', { classList: models.toArray(data) });
        })
    }
    /**
     * 处理用户导入学生信息的方法
     * @param {*} req 
     * @param {*} res 
     */
    importStudentPost(req, res) {

        let upload = tools.myMulter({
            // path: 'public/uploads/',
            // allowSize: 1,
            allowMimes: [
                'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                'application/vnd.ms-excel'
            ]
        }).single('file');

        upload(req, res, function (err) {
            if (err) {
                res.send({ code: 999, msg: '您上传的文件过大' });
                return false;
            }
            if (req.uploadError == '1000') {
                res.send({ code: 1000, msg: '您上传的文件类型不被允许' });
                return false;
            }
            let cls_id = req.body['cls-id'];
            if(!cls_id){
                // 如果没有传递班级id，则返回错误信息 并停止代码的执行
                res.send({ code: 998, msg: '非法操作' }); return false;
            }
            if(!req.file){
                res.send({ code: 1001, msg: '请正确上传文件' }); return false;
            }

            // 如果上传成功，我们就要从excel中读取内容

            // 创建excel对象
            let workbook = new Excel.Workbook();
            // 读取excel文件
            workbook.xlsx.readFile(req.file.path)
            .then(e=>{
                let tmpData = e.getWorksheet(1).getSheetValues();
                let data = [];
                // 身份证验证对象
                let Validator = new IDValidator();
                for (const [key, val] of tmpData.entries()) {
                    if(key >= 2){
                        let tmp = {cls_id};
                        tmp.name = val[1];
                        // todo 验证手机号格式是否合法
                        tmp.mobile = val[2];
                        // 验证身份证号是否合法
                        if(Validator.isValid(val[3])){
                            tmp.id_card = val[3];
                        }else{
                            res.send({ 
                                code: 997, 
                                msg: "身份证号："+ val[3] +" 不合法，请修改后重新导入" 
                            }); 
                            return false;
                        }
                        if(val[4]){
                            tmp.dorm = 1;
                        }else{
                            tmp.dorm = 0;
                        }
                        data.push(tmp);
                    }
                }
                return data;
            })
            .then(data=>{
                // 批量插入到数据库
                return models.student.bulkCreate(data);
            })
            .then(
                function(data){
                    res.send({code: 0, msg: `成功导入${data.length}条数据`})
                },
                function(err){
                    // 需要将数据库的某些字段设置成唯一索引
                    if(err.name = 'SequelizeUniqueConstraintError'){
                        res.send({code: 996, msg: '您导入的数据已在数据库中，请修改后重试'});
                    }else{
                        res.send({code: 995, msg: '遇到未知错误，请联系系统管理员'});
                    }    
                }
            )
        })
    }
}

module.exports = new student();